package gob.pe.mtpe.struts.action;
import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import gob.pe.mtpe.bean.ListaBean;
import gob.pe.mtpe.ibatis.despachadores.AjaxDespatch;
import gob.pe.mtpe.ibatis.despachadores.ReportePolizaDespatch;
import gob.pe.mtpe.struts.form.LoginForm;
import gob.pe.mtpe.util.funciones.Funciones;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import gob.pe.mtpe.struts.form.MasivoForm;

import gob.pe.mtpe.ibatis.despachadores.MasivoDespatch;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.apache.struts.upload.FormFile;


public class MasivoAction extends DispatchAction{
     private static Logger depurador = Logger.getLogger(MasivoAction.class.getName());
     private Funciones funciones;


public ActionForward inicio(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
    	 request.getSession().removeAttribute("l_compasegrenvio");
    	 LoginForm logForm = (LoginForm)request.getSession().getAttribute("SUSUARIO");
         if(logForm==null) 
        	 return mapping.findForward("sessionnull");
         try {
             return mapping.findForward("inicio");
            } catch (Exception e) { 
            	funciones=new Funciones();
                depurador.log(Level.ERROR,funciones.readStackTrace(e));
                return mapping.findForward("ErrorFatal");   
            }
} 
     
     
     public ActionForward archivo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)  throws Exception {
    	 LoginForm logForm = (LoginForm)request.getSession().getAttribute("SUSUARIO");
         if(logForm==null) 
        	 return mapping.findForward("sessionnull");
         try {
             return mapping.findForward("archivo");
            } catch (Exception e) { 
            	funciones=new Funciones();
                depurador.log(Level.ERROR,funciones.readStackTrace(e));
                return mapping.findForward("ErrorFatal");          
            }
    }
     
     public ActionForward enviar(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Exception {
         MasivoForm mForm = (MasivoForm) form;
         LoginForm logForm = (LoginForm)request.getSession().getAttribute("SUSUARIO");
         if(logForm==null) 
        	 return mapping.findForward("sessionnull");
  
         try {MasivoDespatch dspMasivo = new MasivoDespatch();
             FormFile myFile = mForm.getFileTxt();
             String fileName = myFile.getFileName();
             String v_rename ="";

             if (mForm.getV_tipoArchivo().equals("0")){
                 v_rename=logForm.getV_ruc() + "TRA" + dspMasivo.horaMasivo(mForm) + ".tra";
                 System.out.println(v_rename);
             }

             if (mForm.getV_tipoArchivo().equals("1")){
                 v_rename=logForm.getV_ruc() + "POL" + dspMasivo.horaMasivo(mForm) + ".pol";	
             }

             if (mForm.getV_tipoArchivo().equals("2")){
                 v_rename=logForm.getV_ruc() + "BEN" + dspMasivo.horaMasivo(mForm) + ".ben";	
             }

             if (fileName==null) {
                     fileName="";
             }
                 if (!fileName.equals("")) {
                     boolean flag = upLoad(myFile, v_rename.trim());
                     if (flag == false) {
                         return mapping.findForward("ErrorFatal");
                     } else {
                         mForm.setV_nomarch(v_rename);
                         request.setAttribute("v_nomarch", v_rename.trim());
                         request.setAttribute("exito", "1");
                     }
             }

             return mapping.findForward("archivo");                

         } catch (Exception e) {
             funciones=new Funciones();
             depurador.log(Level.ERROR," ERROR ENVIAR  "+funciones.readStackTrace(e));
             return mapping.findForward("ErrorFatal");
         }

     }

     
     public boolean upLoad(FormFile myFile, String v_rename) {
         String v_path = Funciones.ObtieneProperty("mtpe.util.properties.mtpe_reportes","R23");
         boolean flag = false;
         try {
              
         String fileName = myFile.getFileName();
         System.out.println("fileName--->"+fileName);
             
         if(myFile.getFileSize() >=512000){
             depurador.fatal("ARCHIVO MASIVO SOBREPASA LOS  "+myFile.getFileSize()  +"KB");
         }
         
         if (!fileName.equals("")) {
             // Create file
             File fileToCreate = new File(v_path + fileName);
             // If file does not exists create file
             if (!fileToCreate.exists()) {
                 FileOutputStream fileOutStream = new FileOutputStream(fileToCreate);
                 fileOutStream.write(myFile.getFileData());
                 fileOutStream.flush();
                 fileOutStream.close();
                 File fcreate = new File(v_path + fileName);
                 File frename = new File(v_path + v_rename);
                 System.out.println("frename--->"+frename);
                 boolean correcto = fcreate.renameTo(frename);

                 if (correcto)
                     depurador.info("El renombrado ha sido correcto");
                 else {
                     depurador.error("El renombrado no se ha podido realizar");
                 }
             }
         }
         
         flag = true;
 	} catch (Exception e) {
 	    funciones=new Funciones();
 	    depurador.log(Level.ERROR," ERROR UPLOAD MASIVO  "+funciones.readStackTrace(e));
 	    flag = false;
 	}
 	return flag;
     }
 
    
     public ActionForward reenvio(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)  throws Exception {
    	 request.getSession().removeAttribute("l_compasegrenvio");
    	 LoginForm logForm = (LoginForm)request.getSession().getAttribute("SUSUARIO");
         if(logForm==null) 
        	 return mapping.findForward("sessionnull");
         try {
        	 AjaxDespatch ajaxDespach= new AjaxDespatch();	
        	 request.getSession().setAttribute("l_compasegrenvio", ajaxDespach.obtCompAseguradora(logForm.getV_ruc()));
             return mapping.findForward("reenvio");
            } catch (Exception e) { 
            	funciones=new Funciones();
                depurador.log(Level.ERROR,funciones.readStackTrace(e));
                return mapping.findForward("ErrorFatal");          
            }
    }
     
     public ActionForward buscarListar(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Exception {
	        LoginForm logForm = (LoginForm)request.getSession().getAttribute("SUSUARIO");
	        if(logForm==null) 
	        	return mapping.findForward("sessionnull");
	        
	        MasivoForm masivoForm = (MasivoForm)form;
	        try{ 
	        	depurador.info("INGRESANDO AL METODO BUSCAR POLIZA PARA MASIVO");
	        	MasivoDespatch dspMasivo = new MasivoDespatch();
	        	masivoForm.setV_ruc(logForm.getV_ruc());
	            request.setAttribute("lstSeguro", dspMasivo.obtSeguro(masivoForm));
	        }catch (Exception e) {
	            funciones=new Funciones();
	            depurador.log(Level.ERROR,"ERROR AL BUSCAR LAS POLIZAS  ruc="+masivoForm.getV_ruc()+" "+funciones.readStackTrace(e));
	            return mapping.findForward("ErrorFatal");
	        }
	        return mapping.findForward("reenvio");
	    }
	    
     
     
     public ActionForward reporte(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)  throws Exception {
    	 LoginForm logForm = (LoginForm)request.getSession().getAttribute("SUSUARIO");
         if(logForm==null) 
        	 return mapping.findForward("sessionnull");
         try {
             return mapping.findForward("reporte");
            } catch (Exception e) { 
            	funciones=new Funciones();
                depurador.log(Level.ERROR,funciones.readStackTrace(e));
                return mapping.findForward("ErrorFatal");          
            }
    }
     
     public ActionForward trabajadormasivoerror(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)  throws Exception {
    	 depurador.info("muestra reporte error Trabajador---");
    	 LoginForm logForm = (LoginForm)request.getSession().getAttribute("SUSUARIO");
    	  if(logForm==null) 
    		  return mapping.findForward("sessionnull");
         try {
             Funciones funciones = new Funciones();
             Map parameters = new HashMap();
             ListaBean listaBean = new ListaBean();
             List lista = null;
             String reporte = "";
             String codemp=logForm.getV_ruc();             
             String fecha=request.getParameter("fecha");             

             depurador.info("ruc---"+codemp);
             depurador.info("fecha---"+fecha);             
             listaBean.setV_codemp(codemp);
             listaBean.setD_fecreg(fecha);
             String p_reporte = "";

             ServletContext servletContext = servlet.getServletConfig().getServletContext();
             parameters.put("PV_RUTA_IMAGEN",servletContext.getRealPath("/util/images/imagenes/logo_mtpe.jpg")) ;
             parameters.put("PV_CODEMP", codemp);
             parameters.put("PV_FECREG", fecha);             

             MasivoDespatch masivoDespatch = new MasivoDespatch();
             reporte=Funciones.ObtieneProperty("mtpe.util.properties.mtpe_reportes","014");
             lista =  masivoDespatch.trabajadormasivoerror(listaBean);
             mostrarReporte(parameters,reporte,lista,response);
         } catch (Exception e) {
            funciones=new Funciones();
            depurador.log(Level.ERROR,funciones.readStackTrace(e));
            return mapping.findForward("ErrorFatal");
         }
         return null;
 }
    

     public ActionForward beneficiariomasivoerror(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)  throws Exception {
    	 depurador.info("muestra reporte error Beneficiario---");
    	 LoginForm logForm = (LoginForm)request.getSession().getAttribute("SUSUARIO");
    	  if(logForm==null) 
    		  return mapping.findForward("sessionnull");
         try {
             Funciones funciones = new Funciones();
             Map parameters = new HashMap();
             ListaBean listaBean = new ListaBean();
             List lista = null;
             String reporte = "";
             String codemp=logForm.getV_ruc();             
             String fecha=request.getParameter("fecha");             

             depurador.info("ruc---"+codemp);
             depurador.info("fecha---"+fecha);             
             listaBean.setV_codemp(codemp);
             listaBean.setD_fecreg(fecha);
             String p_reporte = "";

             ServletContext servletContext = servlet.getServletConfig().getServletContext();
             parameters.put("PV_RUTA_IMAGEN",servletContext.getRealPath("/util/images/imagenes/logo_mtpe.jpg")) ;
             parameters.put("PV_CODEMP", codemp);
             parameters.put("PV_FECREG", fecha);             

             MasivoDespatch masivoDespatch = new MasivoDespatch();
             reporte=Funciones.ObtieneProperty("mtpe.util.properties.mtpe_reportes","015");
             lista =  masivoDespatch.beneficiariomasivoerror(listaBean);
             mostrarReporte(parameters,reporte,lista,response);
         } catch (Exception e) {
            funciones=new Funciones();
            depurador.log(Level.ERROR,funciones.readStackTrace(e));
            return mapping.findForward("ErrorFatal");
         }
         return null;
 }

     
public ActionForward polizamasivoerror(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)  throws Exception {
    	 depurador.info("muestra reporte error Beneficiario---");
    	 LoginForm logForm = (LoginForm)request.getSession().getAttribute("SUSUARIO");
    	  if(logForm==null) 
    		  return mapping.findForward("sessionnull");
         try {
             Funciones funciones = new Funciones();
             Map parameters = new HashMap();
             ListaBean listaBean = new ListaBean();
             List lista = null;
             String reporte = "";
             String codemp=logForm.getV_ruc();             
             String fecha=request.getParameter("fecha");             

             depurador.info("ruc---"+codemp);
             depurador.info("fecha---"+fecha);             
             listaBean.setV_codemp(codemp);
             listaBean.setD_fecreg(fecha);
             String p_reporte = "";

             ServletContext servletContext = servlet.getServletConfig().getServletContext();
             parameters.put("PV_RUTA_IMAGEN",servletContext.getRealPath("/util/images/imagenes/logo_mtpe.jpg")) ;
             parameters.put("PV_CODEMP", codemp);
             parameters.put("PV_FECREG", fecha);             

             MasivoDespatch masivoDespatch = new MasivoDespatch();
             reporte=Funciones.ObtieneProperty("mtpe.util.properties.mtpe_reportes","016");
             lista =  masivoDespatch.polizamasivoerror(listaBean);
             mostrarReporte(parameters,reporte,lista,response);
         } catch (Exception e) {
            funciones=new Funciones();
            depurador.log(Level.ERROR,funciones.readStackTrace(e));
            return mapping.findForward("ErrorFatal");
         }
         return null;
 }

     void mostrarReporte(Map parameters,String reporte,List lista,HttpServletResponse response) throws  JRException{
    	 depurador.info("mostrarReporte==>");
    	 byte[] bytes=null;
          System.out.println(" 1 ======>"+reporte);
          ServletContext servletContext = servlet.getServletConfig().getServletContext();
          System.out.println(" 2 ======>");
          //JasperDesign jasperDesign = JRXmlLoader.load(servletContext.getRealPath("/jspDocs/reportes/rpt_reimprimir.jrxml"));
          JasperDesign jasperDesign = JRXmlLoader.load(servletContext.getRealPath("/jspDocs/reportes/"+reporte));
          System.out.println(" 3 ======>");
          JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
          System.out.println(" 4 ======>");
          bytes = JasperRunManager.runReportToPdf(jasperReport,parameters, new JRBeanCollectionDataSource(lista));
           try {
               if(bytes != null && bytes.length > 0){
                     response.setContentType("application/pdf");
                     response.setContentLength(bytes.length);
                     ServletOutputStream ouputStream = response.getOutputStream();
                     ouputStream.write(bytes, 0, bytes.length );
                     ouputStream.flush();
                     ouputStream.close();
             }
          } catch (Exception e) {
              funciones=new Funciones();
              depurador.log(Level.ERROR,funciones.readStackTrace(e));
          }

   }

     public ActionForward adjuntar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)  throws Exception {    	 
    	 LoginForm logForm = (LoginForm)request.getSession().getAttribute("SUSUARIO");    	 
         if(logForm==null) 
        	 return mapping.findForward("sessionnull");
         try {
        	 MasivoForm mForm = (MasivoForm) form;
        	 String corpol = request.getParameter("corpol");
        	 String accion = request.getParameter("accion");        	 
        	 mForm.setV_tipoArchivo(accion);
        	 mForm.setN_corrpol(corpol);
        	 depurador.info("numero de operacion--->"+corpol);
        	 depurador.info("accion a realizar--->"+accion);
             return mapping.findForward("adjuntarreenvioArchivo");
            } catch (Exception e) { 
            	funciones=new Funciones();
                depurador.log(Level.ERROR,funciones.readStackTrace(e));
                return mapping.findForward("ErrorFatal");          
            }
    }
   
     
     public ActionForward enviarreenvio(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Exception {
         MasivoForm mForm = (MasivoForm) form;
         LoginForm logForm = (LoginForm)request.getSession().getAttribute("SUSUARIO");
         if(logForm==null) 
        	 return mapping.findForward("sessionnull");
  
         try {MasivoDespatch dspMasivo = new MasivoDespatch();
             FormFile myFile = mForm.getFileTxt();
             String fileName = myFile.getFileName();
             String v_rename ="";

             depurador.info("mForm.getV_tipoArchivo()-->"+mForm.getV_tipoArchivo());
             
             if (mForm.getV_tipoArchivo().equals("0")){
                 v_rename= logForm.getV_ruc() + "TRA" + dspMasivo.horaMasivo(mForm) + ".tra";		
             }

             if (mForm.getV_tipoArchivo().equals("1")){
                 v_rename= logForm.getV_ruc() + "POL" + dspMasivo.horaMasivo(mForm) + StringUtils.leftPad( mForm.getN_corrpol(), 10, '0')+ ".rpol";	
             }

             if (mForm.getV_tipoArchivo().equals("2")){
                 v_rename= logForm.getV_ruc() + "BEN" + dspMasivo.horaMasivo(mForm) +StringUtils.leftPad( mForm.getN_corrpol(), 10, '0')+ ".rben";	
             }
             depurador.info("nombrearchivo-->"+v_rename);

             if (fileName==null) {
                     fileName="";
             }
                 if (!fileName.equals("")) {
                     boolean flag = upLoad(myFile, v_rename);
                     if (flag == false) {
                         return mapping.findForward("ErrorFatal");
                     } else {
                         mForm.setV_nomarch(v_rename);
                         request.setAttribute("v_nomarch", v_rename);
                         request.setAttribute("exito", "1");
                     }
             }

             return mapping.findForward("adjuntarreenvioArchivo");                

         } catch (Exception e) {
             funciones=new Funciones();
             depurador.log(Level.ERROR," ERROR ADJUNAR "+funciones.readStackTrace(e));
             return mapping.findForward("ErrorFatal");
         }

     }
 
public ActionForward verPolizaEcell(ActionMapping mapping, ActionForm form,
 	        HttpServletRequest request, HttpServletResponse response)

 	throws Exception {
 		LoginForm logForm = (LoginForm)request.getSession().getAttribute("SUSUARIO");	
 		  if(logForm==null) 
 	      return mapping.findForward("sessionnull");
 		System.out.println("ENTRANDO al EXCEUTE DE EXCEL ACTION");
 		ListaBean listaBean= new ListaBean();
 		List lista = null;
 		String fecha=request.getParameter("fecha");
 		
 		MasivoDespatch masivoDespatch = new MasivoDespatch();
 		listaBean.setV_codemp(logForm.getV_ruc());
         listaBean.setD_fecreg(fecha);
 		
 		depurador.info("ruc-->"+listaBean.getV_codemp());
 		depurador.info("poliza-->"+listaBean.getD_fecreg());
 		 
 		lista=masivoDespatch.polizamasivoerror(listaBean);
 		
 		request.setAttribute("l_trabajadorpoliza", lista);
 		System.out.println("lista.size  ==>" + lista.size());
 		return mapping.findForward("verpolizaexcell");
 	}
     
}







